[Update] การใช้ฟังก์ชัน Auto Scaling เพิ่มและลด Instance โดยอัตโนมัติใน Elastic Beanstalk

[Update] การใช้ฟังก์ชัน Auto Scaling เพิ่มและลด Instance โดยอัตโนมัติใน Elastic Beanstalk

Elastic Beanstalk มีฟังก์ชัน Auto Scaling เพื่อเพิ่มและลด Instance โดยอัตโนมัติ ในบทความนี้จะมาแนะนำเนื้อหาไปพร้อมกับการใช้งานจริง

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

Auto scaling สามารถควบคุมการทำงานของ Instance เพื่อปรับความสมดุลให้ระบบทำงานได้อย่างต่อเนื่อง เช่น เมื่อมีการเข้าถึง Server มาเป็นจำนวนมากจน CPU Utilization มีการทำงานมากกว่าที่เราตั้งค่าไว้ Instance ก็จะถูกสร้างเพิ่มขึ้นมาให้เพียงพอต่อการใช้งานโดยอัตโนมัติ

สิ่งที่ต้องมี

※สร้าง Application ใน Elastic Beanstalk แล้ว

ตัวอย่างครั้งนี้จะสร้าง Application โดยใช้ชื่อดังนี้
Application: tinnakorn

ดูตัวอย่างได้ที่ลิงก์หัวข้อนี้: สร้าง Application ใน Elastic Beanstalk

สร้าง Environment สำหรับ Auto Scaling

ตัวอย่างครั้งนี้จะสร้าง Environment โดยใช้ชื่อดังนี้
Environment: tinnakorn-autoscale

ดูตัวอย่างเพิ่มเติมได้ที่ลิงก์บทความและตัวอย่างตาม Step ด้านล่างนี้ (สำหรับผู้ใช้งานที่รู้วิธีการสร้าง Environment อยู่แล้วข้ามขั้นตอนนี้ไปได้เลย)

ครั้งนี้จะสร้าง Environment โดย Deploy Laravel ใน Elastic Beanstalk และเชื่อมต่อกับ RDS ดังนี้

Step 1: Configure environment

หัวข้อ Environment information
・Environment name: tinnakorn-autoscale (ชื่ออะไรก็ได้)
・Domain: tinnakorn-autoscale (ชื่ออะไรก็ได้)

หัวข้อ Platform
・Platform: PHP

หัวข้อ Application code
・เลือกวิธีอัปโหลดไฟล์ตามต้องการ (ครั้งนี้จะใช้โปรเจกต์ Laravel)

・คลิก Next

Step 2: Configure service access

หัวข้อ Service access
・Service role: Use an existing service role
・Existing service roles: aws-elasticbeanstalk-service-role
・EC2 key pair: tinnakorn-autoscale
・EC2 instance profile: aws-elasticbeanstalk-ec2-role
・คลิก Next

Step 3 - optional: Set up networking, database, and tags

Step นี้ระบุว่า "optional" จึงไม่จำเป็นต้องตั้งค่าอะไร เพราะเป็นการทดสอบการใช้งาน ให้คลิก Next ได้เลย

**ตั้งแต่ขั้นตอนนี้ไปจะแตกต่างจากตัวอย่างในบทความข้างต้น**

Step 4 - optional: Configure instance traffic and scaling

Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้

หัวข้อ Instances
Root volume (boot device):
・Root volume type: General Purpose (SSD)
・Size: 10 GB (ขั้นต่ำคือ 10 GB)

แล้วค้นหาและเลือก EC2 security groups สำหรับ Elastic Beanstalk ที่สร้างในตอนแรก เช่น tinnakorn-autoscale

หัวข้อ Capacity
Auto scaling group
・Environment type: Load balanced
・Instances: 1 Min, 6 Max (ครั้งนี้จะตั้งค่าจำนวน Instance สูงสุดอยู่ที่ 6 ตัว)

・Instance types: t3a.nano
・Scaling cooldown: 60 seconds

เลื่อนลงมาที่หัวข้อ Scaling triggers แล้วตั้งค่าดังนี้
・Metric: CPUUtilization
・Statistic: Average
・Unit: Percent
・Period: 1
・Breach duration: 1
・Upper threshold: 50
・Scale up increment: 1 EC2 instances
・Lower threshold: 10 capacity
・Scale down increment: -1 EC2 instances

หัวข้อ Load Balancer Type
เลือก Application load balancer

แล้วเลื่อนลงมาด้านล่างสุดและคลิก Next

Step 5 - optional: Configure updates, monitoring, and logging

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: Step 5 - optional: Configure updates, monitoring, and logging

Step 6: Review

ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit ด้านล่างสุด แล้วรอสักครู่

ระหว่างที่ระบบกำลังเริ่มต้นจะมีสถานะเป็น [UnknownPendingOK] เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ โดยมี Domain ที่เป็นลิงก์สำหรับแสดงผลหน้าเว็บไซต์ และมี Running version เป็นชื่อตามที่ป้อนตอนอัปโหลดไฟล์ ZIP

ติดตั้ง ab (Apache Bench) ในสภาพแวดล้อมการพัฒนา

ก่อนอื่นให้เตรียม EC2 Instance อื่นเพื่อติดตั้ง ab (Apache Bench) สำหรับทดลอง Auto Scaling ของ Elastic Beanstalk โดยดูตัวอย่างได้ที่ลิงก์บทความด้านล่างนี้ (หากมีสภาพแวดล้อมอยู่แล้วข้ามขั้นตอนนี้ไปได้เลย)

Apache Bench เป็นเครื่องมือสำหรับการทดสอบ Stress Test โดยสามารถติดตั้งในสภาพแวดล้อมการพัฒนาอื่นที่ไม่เกี่ยวข้องกับ Instance ของ Auto scaling และทำการทดสอบการใช้งานเว็บไซต์ที่ต้องการได้

ติดตั้ง Apache Bench ด้วยคำสั่งนี้ใน Server EC2 อื่น เพราะหลังจากทดสอบ ab เสร็จแล้ว Instance ของ Auto scaling จะถูก Terminate โดยอัตโนมัติ

sudo yum install httpd-tools -y

Apace Bench (ab) usage

วิธีใช้ ab [options] [http[s]://]hostname[:port]/path

options ที่เราจะใช้ในการทดสอบคือ

ab -n [จำนวนครั้งที่มีการเข้าถึง] -c [จำนวนครั้งที่มีการเข้าถึงพร้อมกัน] [http[s]://]hostname[:port]/path

ตรวจสอบเกี่ยวกับ Environment ที่สร้างใน Elastic Beanstalk

ก่อนอื่นให้เปิดหน้า Events, Health, Monitoring และ CloudWatch เตรียมไว้ เพราะระหว่างการทดสอบเราจะต้องดูการเปลี่ยนแปลงในหน้าเหล่านี้ครับ

Events

เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Events ใน Environment ของเรา ก็จะเห็นสถานะการใช้งานต่างๆ

Health

เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health ใน Environment ของเรา ก็จะเห็น Instance ID ที่กำลังใช้งานอยู่

Monitoring

เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Monitoring ใน Environment ของเรา แล้วดูที่กราฟ CPU Utilization สถานะการใช้งานตอนนี้คือปกติ

CloudWatch

เข้ามาที่ Service CloudWatch เลือก All alarms จากเมนูด้านซ้าย และเลือกชื่อ Alarms ของเราโดยให้ดูที่ช่วงเวลาที่ Last state update

เมื่อเข้ามาแล้วจะแสดงหน้าจอแบบนี้
ในส่วนของ CPUUtilization หาก CPU มีค่ามากกว่า 50% (CPU > 50) ภายใน 1 นาทีจะมีการแจ้งเตือน (Alarm) และเมื่อมีการแจ้งเตือนขึ้นมาแล้ว Instance ก็จะถูกสร้างเพิ่มขึ้นมาอัตโนมัติ

เมื่อดูสถานการณ์จากหน้าจอเหล่านี้แล้วก็จะรู้ช่วงเวลาที่ Instance เพิ่มขึ้นมา ดังนั้นให้เปิดหน้าจอเหล่านี้ค้างไว้ เพราะจะเริ่มทดสอบในขั้นตอนถัดไปครับ

ทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab

เราจะทำการทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab ที่ติดตั้งใน EC2 Instance อื่น

Run command ทดสอบการเข้าถึงเว็บไซต์ของ Environment

ขั้นตอนนี้จะรันคำสั่ง ab เพื่อทดสอบการเข้าถึงเว็บไซต์ที่สร้างจาก Environment ใน Elastic Beanstalk

ไปที่หน้าเว็บไซต์ที่ใช้งานผ่าน Elastic Beanstalk และ Copy URL โปรเจกต์ของเรามา ในตัวอย่างนี้คือ

http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer


แล้วทดสอบการเข้าถึงแค่ 1 ครั้งโดยรันคำสั่งตามนี้ (ab -n 1 -c 1 + Your Domain EB)

ab -n 1 -c 1 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer

*หากรันคำสั่งไปแล้วไม่แสดงแบบนี้ให้รันคำสั่งเดิมอีกครั้ง

Output

[ec2-user@ip-xx-xx-xx-x ~]$ ab -n 1 -c 1 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com (be patient).....done


Server Software:        nginx
Server Hostname:        tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port:            80

Document Path:          /customer
Document Length:        758 bytes

Concurrency Level:      1
Time taken for tests:   0.025 seconds
Complete requests:      1
Failed requests:        0
Total transferred:      1821 bytes
HTML transferred:       758 bytes
Requests per second:    40.13 [#/sec] (mean)
Time per request:       24.922 [ms] (mean)
Time per request:       24.922 [ms] (mean, across all concurrent requests)
Transfer rate:          71.36 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    24   24   0.0     24      24
Waiting:       24   24   0.0     24      24
Total:         25   25   0.0     25      25
[ec2-user@ip-xx-xx-xx-x ~]$


เมื่อทดสอบการเข้าถึงแค่ 1 ครั้งได้โดยไม่มี Error ใดๆ ต่อไปให้รันคำสั่งด้านล่างนี้เพื่อทดสอบการเข้าถึง 100000 ครั้งโดยรันคำสั่งตามนี้ (ab -n 100000 -c 6 + Your Domain EB)

ab -n 100000 -c 6 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer

หลังจากรันคำสั่งไปแล้วจะหยุดที่ Benchmarking สักครู่ เพราะระบบกำลังเข้าถึงเว็บไซต์โปรเจกต์ของเราโดยจะแสดง Completed เพิ่มขึ้นเป็นลำดับตั้งแต่ 10000 - 100000
ระหว่างที่ ab กำลังทำงานอยู่ CPUUtilization จะเพิ่มขึ้นเรื่อยๆ และ Instance ก็จะถูกสร้างเพิ่มขึ้นมาโดยอัตโนมัติจนเพียงพอต่อการใช้งาน และหลังจากที่ Benchmarking เริ่มแสดง Completed 10000 requests แล้วให้เริ่มสังเกตการเปลี่ยนแปลงของ Auto Scaling ตามขั้นตอนถัดไปได้เลยโดยไม่ต้องรอการเข้าถึงจนเสร็จสิ้นที่ Finished 100000 requests และเมื่อการเข้าถึงเสร็จสิ้นแล้วจะแสดงตามด้านล่างนี้

Output

[ec2-user@ip-xx-xx-xx-xx ~]$ ab -n 100000 -c 6 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        nginx
Server Hostname:        tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port:            80

Document Path:          /customer
Document Length:        758 bytes

Concurrency Level:      6
Time taken for tests:   999.321 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      182100000 bytes
HTML transferred:       75800000 bytes
Requests per second:    100.07 [#/sec] (mean)
Time per request:       59.959 [ms] (mean)
Time per request:       9.993 [ms] (mean, across all concurrent requests)
Transfer rate:          177.95 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    1   3.3      1    1038
Processing:    16   59 300.8     26    9794
Waiting:       16   59 300.8     26    9794
Total:         17   60 300.8     27    9795

Percentage of the requests served within a certain time (ms)
  50%     27
  66%     33
  75%     37
  80%     41
  90%     51
  95%     65
  98%    186
  99%    465
 100%   9795 (longest request)
[ec2-user@ip-xx-xx-xx-xx ~]$

สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนมาก

ขั้นตอนนี้ให้สังเกตการเปลี่ยน Environment ขณะที่มีการเข้าถึงจำนวนมากกว่าที่ตั้งค่าไว้ ในตัวอย่างนี้คือ (CPU > 50%)

※CloudWatch
เข้ามาที่ Service CloudWatch เลือก Alarms ของเราและดูที่ Graph
จะเห็นว่า CPUUtilization มีสถานะเป็น In alarm เนื่องจากว่ามีการใช้งานที่มากกว่า 50% เช่นจากรูปสูงขึ้นมาถึง 91% หรืออาจจะสูงกว่านี้ครับ (เมื่อ Instance ถูกสร้างขึ้นมาเพียงพอต่อการใช้งานแล้วสถานะจาก In alarm จะเปลี่ยนเป็น ✅ OK)

※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Monitoring ใน Environment ของเราและดูที่ CPU Utilization
จะเห็นว่า CPU Utilization กำลังสูงขึ้นเรื่อยๆ (ในส่วนนี้จะเกิดขึ้นระหว่าง ab กำลังทำงาน)

※Health
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health ใน Environment ของเราและดูที่ Status
จะเห็นว่าเป็น Status: Warning ถ้าแสดงแบบเดียวกับรูปภาพด้านล่างนี้ คือเนื่องจากว่า CPU Utilization มีการใช้งานมากกว่า 50% ขึ้นไป Auto scaling จึงสร้าง Instance ใหม่ขึ้นมา

เมื่อ Instance ถูกสร้างขึ้นมาเพียงพอต่อการใช้งานแล้ว จะแสดงหน้าจอแบบนี้
การทดสอบครั้งนี้ไม่ว่าจะมีการเข้าถึงเป็นจำนวนมากแค่ไหน Instance ก็จะสร้างขึ้นมาได้สูงสุด 6 Instance เพราะผมตั้งค่า Auto scaling (Instance) ไว้ที่ Max: 6 นั่นเอง แต่ครั้งนี้ Instance สร้างขึ้นมาแค่ 4 Instance ก็เพียงพอต่อการใช้งานแล้ว

※Instance
เข้ามาที่ Service EC2 ดูที่หน้า Instance
จะเห็นว่ามี Instance ทั้งหมด 4 ตัวตามที่แสดงใน Health เลยครับ

※Events
เข้ามาที่ Service Elastic Beanstalk เลือก Events ใน Environment ของเราและดูที่ Details
จะเห็นว่ามีรายละเอียดการสร้าง Instance ขึ้นมาใหม่

สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนน้อย

ขั้นตอนนี้ให้สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนน้อยกว่าที่ตั้งค่าไว้ ในตัวอย่างนี้คือ (CPU > 50%)
เมื่อการทำงานของ ab เสร็จสิ้น CPUUtilization จะลดลง และ Instance ก็จะ Terminate ตัวที่ไม่ได้ใช้โดยอัตโนมัติ

※CloudWatch
เข้ามาที่ Service CloudWatch เลือก Alarms ดูที่ Graph
จะเห็นว่า CPUUtilization มีสถานะเป็น ✅ OK เนื่องจากมีการใช้งานที่ต่ำกว่า 50% เช่นจากรูปลดลงมาที่ 0.658% หรืออาจจะต่ำกว่านี้ครับ

※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Monitoring ดูที่ CPU Utilization
จะเห็นว่า CPU Utilization ลดลงมาอยู่ในสถานะปกติแล้ว (ในส่วนนี้จะเกิดขึ้นหลังจาก ap ทำงานเสร็จแล้ว)

※Health
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health ดูที่ Status
จะเห็นว่าเป็น Status: No Data ถ้าแสดงแบบเดียวกับรูปภาพด้านล่างนี้ คือเนื่องจากว่า CPU Utilization มีการใช้งานที่ลดลงมาต่ำกว่า 50% Auto scaling จึง Terminate Instance ที่ไม่ได้ใช้ออก

เมื่อ Instance ที่ไม่ได้ใช้งานถูก Terminate ออกไปแล้ว จะเหลือแค่ Instance ที่ใช้งานอยู่เท่านั้น
ในตัวอย่างนี้คือจะเหลือ 1 Instance เพราะตัว Auto scaling จะจัดการ Instance ให้เพียงพอต่อการใช้งานให้กับเว็บไซต์ของเรา

※Instance
เข้ามาที่ Service EC2 ดูที่หน้า Instance
จะเห็นว่ามี Instance ที่ไม่ได้ใช้งานถูก Terminate ออกไปทั้งหมด 3 Instance และเหลือ 1 Instance ตามที่แสดงใน Health เลยครับ

※Events
เข้ามาที่ Service Elastic Beanstalk เลือก Events ดูที่ Details
จะเห็นว่ามีรายละเอียดการ Removed Instance ที่ไม่ได้ใช้งานออกไป

ตรวจสอบสถานะของ Instance ใน Server EC2 ด้วย Command

ขั้นตอนนี้ผมจะตรวจสอบสถานะแต่ละ Instance ใน Server EC2 ด้วยคำสั่ง top

ระหว่างทดสอบการทำงานของ ab เราสามารถเข้ามาตรวจสอบสถานะของ Instance ที่นี่ได้
Instance ที่จะตรวจสอบคือ Instance ที่ถูกสร้างขึ้นมาหลังจาก CPU Utilization มีการใช้งานมากกว่า 50% ขึ้นไป

ก่อนอื่นให้ทำการเชื่อมต่อ Server EC2 โดยสามารถศึกษาได้ที่ลิงก์ด้านล่างนี้
ในบทความนี้ผมได้ทำการเชื่อมต่อ Server EC2 ใน VSCode ด้วยวิธีการเชื่อมต่อ EC2 ไปยัง EC2 อื่นครับ

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: เชื่อมต่อ Server EC2

เมื่อเราเชื่อมต่อ Server EC2 ได้แล้วให้รันคำสั่งนี้ใน Terminal ของเราเพื่อตรวจสอบสถานะการใช้งานของ Instance

top

จากรูป เราสามารถเพิ่ม Terminal ใน VSCode และเชื่อมต่อ Server EC2 ได้หลาย Instance ตามที่เราต้องการ

ในตัวอย่างนี้ผมได้เชื่อมต่อไว้ 5 Server (หรือ 5 Instance) คือ
ab = Instance (tinnakorn-develop) ที่ใช้ติดตั้ง ab และทดสอบการทำงานของ Auto scaling (Instance) ใน Elastic Beanstalk (1 Instance)
ssh = Instance ที่ถูกสร้างใน Elastic Beanstalk ทั้งหมด 4 Server (4 Instance)

สรุป

การทำงานของ Auto scaling คือเมื่อมีการเข้าถึง Server มาเป็นจำนวนมากจน CPU Utilization มีการทำงานมากกว่า 50% ขึ้นไป Instance ก็จะถูกสร้างเพิ่มขึ้นมาให้เพียงพอต่อการใช้งาน

ตัวอย่างในบทความนี้ Min คือ 1 Instance เมื่อมีการเข้าถึง Server มาเป็นจำนวนน้อยหรือปกติก็จะเป็น 1 เครื่อง แต่เมื่อมีการเข้าถึง Server มาเป็นจำนวนมาก Instance ก็จะถูกสร้างเพิ่มขึ้นมาได้สูงสุด 6 Server (หรือ 6 Instance) ตามที่เราตั้งค่าไว้นั่นเอง

นอกจากนี้การทำงานของ Instance ที่ควบคุมด้วย Auto scaling จะขึ้นอยู่กับการตั้งค่าและโครงสร้างโปรเจกต์ของคุณด้วยครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.